package gee

import (
	"encoding/json"
	"fmt"
	"net/http"
)

// 方便JSON使用
type H map[string]interface{}

// Context定义
// 目标是收集所有需要交互的对象
// 方便使用者使用
type Context struct {
	// 原始对象
	Writer http.ResponseWriter
	Req    *http.Request

	// 请求中的常用信息
	Path   string
	Method string

	// 响应中的常用信息
	StatusCode int
}

// 新建Context
func newContext(w http.ResponseWriter, r *http.Request) *Context {
	return &Context{
		Writer: w,
		Req:    r,
		Path:   r.URL.Path,
		Method: r.Method,
	}
}

/*
	获取请求中的值
*/

// 获取表单中某个值
func (c *Context) PostForm(key string) string {
	return c.Req.FormValue(key)
}

// 获取Query中某个值
func (c *Context) Query(key string) string {
	return c.Req.URL.Query().Get(key)
}

/*
	将信息写入响应
*/

// 写入响应状态
func (c *Context) Status(code int) {
	c.StatusCode = code
	c.Writer.WriteHeader(code)
}

// 写入响应头
func (c *Context) SetHeader(key string, value string) {
	c.Writer.Header().Set(key, value)
}

// 写入字符串
func (c *Context) String(code int, format string, values ...interface{}) {
	c.Status(code)
	c.SetHeader("Content-Type", "text/plain")

	c.Writer.Write([]byte(fmt.Sprintf(format, values...)))
}

// 写入JSON
func (c *Context) JSON(code int, obj interface{}) {
	c.Status(code)
	c.SetHeader("Content-Type", "application/json")

	encoder := json.NewEncoder(c.Writer)
	if err := encoder.Encode(obj); err != nil {
		http.Error(c.Writer, err.Error(), 500)
	}
}

// 写入byte值
func (c *Context) Data(code int, data []byte) {
	c.Status(code)
	c.Writer.Write(data)
}

// 写入HTML
func (c *Context) HTML(code int, html string) {
	c.Status(code)
	c.SetHeader("Content-Type", "text/plain")

	c.Writer.Write([]byte(html))
}
